import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.*;

/**
 * Esta clase es la controla el usuario y es manipulada por el mouse.
 * 
 * @author Ulises Yamil Castorena Caldera 
 * @version 1.0
 */
public class User extends Actor
{   
    private int ammo;//Variable para las municiones.
    private boolean disp;//Indica si ya disparo.
    private GreenfootSound son;//Variable que guarda el sonido de disparo.
    private GreenfootSound rel;//Variable que guarda el sonido de la recarga.
    
    /**
     * Constructor de la clase User.
     */
    public User()
    {
        ammo = 10;
        disp = false;       
        son = new GreenfootSound("shotgun.mp3");
        rel = new GreenfootSound("reload.mp3");
    }
    
    /**
     * Método act de la clase.
     */
    public void act() 
    {
        mouseMove();
        if(Greenfoot.isKeyDown("r"))
        {
            rel.play();
            ammo = 10;
        }
        if(!son.isPlaying())
            mouseClick();        
    }          
    
    /**
     * Encuentra la ubicación del mouse y coloca la imagen según las coordenadas.
     */
    public void mouseMove()
    {
        if(Greenfoot.mouseMoved(null)) 
        {
            MouseInfo mouse = Greenfoot.getMouseInfo();
            setLocation(mouse.getX(), mouse.getY());
        }       
    }
    
    /**
     * Si las municiones son mayores a cero, entonces una lista con los actores de la clase Targets son analizados para saber
     * en cual objeto se dio click y dependiendo de dondé se haya dado click será el método a llamar.
     */
    public void mouseClick()
    {   
        if(ammo > 0)
        {
            if(Greenfoot.mouseClicked(null))
            {
                son.play();
                List lista = getWorld().getObjects(Targets.class);
                Iterator it = lista.iterator();
                Actor act;            
                while(it.hasNext())
                {                
                    if(Greenfoot.mouseClicked(act = (Targets)it.next()))
                    {   
                        if(act instanceof Duck)
                        {
                            ammo--;
                            disp = true;
                            ((Duck)act).cambiaVivo();
                            ((Duck)act).modificaScore();
                        }
                        else if(act instanceof Falcon)
                        {
                            ammo--;                        
                            disp = true;
                            ((Falcon)act).cambiaVivo();
                        }
                        else if(act instanceof Lion)
                        {
                            ammo--;
                            disp = true;
                            ((Lion)act).cambiaVivo();
                        }
                    }                                          
                }               
                if(!disp)
                    ammo--;                
            }
            disp = false;
        }    
    }
    
    /**
     * Método que es utilizado para saber la cantidad me municiones disponible.
     * @return La cantidad de municiones.
     */
    public int returnAmmo()
    {
        return ammo;
    }
}
